package generique;

import java.text.SimpleDateFormat;
import java.util.Date;



/**
 * 
 * Classe permettant d'afficher ou logger des messages.
 * 
 * @author Valentin Brémond
 * 
 * @version 1.0
 *
 */
public class Log
{
	/**
	 * Singleton.
	 */
	private static Log instance = null;
	
	/**
	 * On définit les types de message.
	 */
	private static final int MESSAGE_INFO = 1, MESSAGE_WARNING = 2, MESSAGE_ERREUR = 3;
	
	/**
	 * Permet de stocker la date à afficher.
	 */
	private Date date;
	
	/**
	 * Permet de mettre en forme cette date.
	 */
	private SimpleDateFormat format;
	
	
	
	// CONSTRUCTEUR
	
	
	
	/**
	 * Constructeur par défaut (privé pour empêcher l'instanciation).
	 */
	private Log ()
	{
		super ();
		
		format = new SimpleDateFormat ("dd/MM/yyyy - hh:mm:ss.SSS");
	}
	
	
	
	// MÉTHODES
	
	
	
	/**
	 * Singleton.
	 * 
	 * @return L'instance de la classe Log.
	 */
	public static Log getInstance ()
	{
		if (Log.instance == null)
		{
			instance = new Log ();
		}
		
		return instance;
	}
	
	
	
	/**
	 * Permet d'afficher un message d'information.
	 * 
	 * @param message Le message à afficher.
	 */
	public void info (String message)
	{
		afficherMessage (MESSAGE_INFO, message);
	}
	
	
	
	/**
	 * Permet d'afficher un message d'avertissement.
	 * 
	 * @param message Le message à afficher.
	 */
	public void warning (String message)
	{
		afficherMessage (MESSAGE_WARNING, message);
	}
	
	
	
	/**
	 * Permet d'afficher un message d'erreur, puis de terminer l'application.
	 * 
	 * @param message Le message à afficher.
	 */
	public void error (String message)
	{
		afficherMessage (MESSAGE_ERREUR, message);
		System.exit (1);
	}
	
	
	
	/**
	 * Permet d'afficher un message d'erreur (avec trace de l'exception), puis de terminer l'application.
	 * 
	 * @param message Le message à afficher.
	 * @param e L'exception à afficher.
	 */
	public void error (String message, Exception e)
	{
		afficherMessage (MESSAGE_ERREUR, message, e);
		System.exit (1);
	}
	
	
	
	/**
	 * Permet d'afficher un message.
	 * 
	 * @param typeMessage Le type de message à afficher (info, warning, erreur...).
	 * @param message Le message à afficher.
	 */
	private void afficherMessage (int typeMessage, String message)
	{
		// On récupère la date
		date = new Date ();
		
		// On la met en forme
		String info = format.format (date) + " > ";
		
		// On ajoute le type du message
		switch (typeMessage)
		{
			case MESSAGE_INFO: info += "[INFO] ";
			break;
			
			case MESSAGE_WARNING: info += "[WARNING] ";
			break;
			
			case MESSAGE_ERREUR: info += "[ERREUR] ";
			break;
			
			default: info += "[ERREUR - type inconnu (" + typeMessage + ")] ";
			break;
		}
		
		// On ajoute le message
		info += message;
		
		// Puis on l'affiche sur la sortie
		if (typeMessage != MESSAGE_ERREUR)
		{
			System.out.println (info);
		}
		else
		{
			System.err.println (info);
		}
	}
	
	
	
	/**
	 * Permet d'afficher un message puis des informations sur l'exception.
	 * 
	 * @param TYPE_MESSAGE Le type de message à afficher (info, warning, erreur...).
	 * @param message Le message à afficher.
	 * @param e L'exception.
	 */
	private void afficherMessage (int TYPE_MESSAGE, String message, Exception e)
	{
		afficherMessage (TYPE_MESSAGE, message);
		e.printStackTrace ();
	}
}
